const account = require('express');// 引入express框架
const router = account.Router();    //实例化一个router
const User = require("../../models/Users");   //引入models下面的Users.js

// bcrypt 直接将 salt 保存在里加密计算得到的哈希字符串里。
// 匹配思路是 从哈希值字符串中提取出salt，将其添加到密码明文中，再进行一次加盐哈希运算。
// 比对 得到的结果 和 旧有的哈希字符串，由此判断密码是否匹配。
const bcrypt = require("bcrypt");   //引入加密

// logs日志
const log = require('../logger');

const passport = require("passport");     //引入passport中间件

// const moment = require('moment-timezone'); //mongodb不同时区问题

const jwt = require('jsonwebtoken'); // jwt实现token
const config = require('../../config');// 调取config 参数

router.get("/", (req, res) => {
    res.send('首页');
});

//$route GET api/users/current
//@desc return current user
//@access private
//验证token得到用户信息
//使用passport-jwt验证token
router.get("/current", passport.authenticate("jwt", { session: false }), (req, res) => {
    res.json({ msg: "success" });
})

// 注册
router.post("/register", (req, res) => {
    const body = req.body;

    //查询users表中是否存在用户名
    User.findOne({ username: body.username })
        .then((user) => {
            if (user) {
                return res.status(400).json({
                    code: 400,
                    error: "用户名已存在。"
                });
            } else {
                const newUser = new User({
                    username: body.username,
                    password: body.password,
                    mobile: body.mobile,
                    email: body.email
                })
                //密码加密  需npm install bcrypt
                bcrypt.genSalt(10, function (err, salt) {
                    bcrypt.hash(newUser.password, salt, function (err, hash) {
                        //store hash in your password DB.
                        if (err) { throw log.info(__filename, err, "bcrypt密码hash加密失败:"); }
                        newUser.password = hash;
                        // 注意：newUser.date 保存到数据库是格林威治时间，取值只要 toLocaleString()即可是当时北京时间new Date(report.datetime).toLocaleString()
                        newUser.save()
                            .then(user => res.json({
                                code: 200,
                                error: "注册成功。",
                                body: user
                            }))
                            .catch(err => res.json({
                                code: 400,
                                error: "保存失败。",
                                body: err
                            }));
                    });
                });
            }
        })
});

// 用户登录
router.post('/login', (req, res, next) => {
    const body = req.body;
    let cond = {
        username: body.username
    };
    //查询数据库
    User.findOne(cond)
        .then(user => {
            if (!user) {
                return res.status(400).json({
                    code: 400,
                    error: "用户不存在。"
                });
            }
            //密码匹配  使用token
            bcrypt.compare(body.password, user.password)
                .then(isMatch => {
                    if (isMatch) {
                        const rule = { name: user.name };
                        //用id和name来做一个token
                        // jwt.sign("规则", "加密名字", "过期时间", "箭头函数");
                        jwt.sign(rule, config.secretOrKey, { expiresIn: 3600 }, (err, token) => {
                            if (err) { throw err };
                            User.updateOne(cond, { $set: { token: token } },
                                (err, data) => {
                                    if (err) {
                                        res.status(400).json({
                                            code: 422, error: err
                                        });
                                    } else {
                                        log.info(__filename, token, "jwt生成token:");

                                        return res.status(200).json({
                                            code: 200,
                                            success: "登陆成功。",
                                            token: token
                                        });
                                    }
                                })
                        })
                    } else {
                        return res.status(400).json({
                            code: 400,
                            error: "密码错误。"
                        });
                    }
                })
        })
});

// 用户修改信息
// router.post('/updateInfo', (req, res, next) => {
//     const body = req.body;
//     let cond = {
//         username: body.username
//     };
//     //查询数据库
//     User.findOne(cond)
//         .then(user => {
//             if (!user) {
//                 return res.status(400).json({
//                     code: 400,
//                     error: "用户不存在。"
//                 });
//             }
//             //密码匹配  使用token
//             bcrypt.compare(body.password, user.password)
//                 .then(isMatch => {
//                     if (isMatch) {
//                         const rule = { name: user.name };
//                         //用id和name来做一个token
//                         // jwt.sign("规则", "加密名字", "过期时间", "箭头函数");
//                         jwt.sign(rule, config.secretOrKey, { expiresIn: 3600 }, (err, token) => {
//                             if (err) { throw err };
//                             User.updateOne(cond, { $set: { token: token } },
//                                 (err, data) => {
//                                     if (err) {
//                                         res.status(400).json({
//                                             code: 422, error: err
//                                         });
//                                     } else {
//                                         log.info(__filename, token, "jwt生成token:");

//                                         return res.status(200).json({
//                                             code: 200,
//                                             success: "登陆成功。",
//                                             token: token
//                                         });
//                                     }
//                                 })
//                         })
//                     } else {
//                         return res.status(400).json({
//                             code: 400,
//                             error: "密码错误。"
//                         });
//                     }
//                 })
//         })
// })

router.get("/news", (req, res) => {
    res.jsonp({ msg: "这是新闻数据" })
});

router.get('/products/:id', function (req, res, next) {
    res.json({
        msg: 'This is CORS-enabled for all origins!'
    })
})

module.exports = router;

